import { def } from "../uitl";

const arrayProto = Array.prototype;

// 创建一个对象作为拦截器
export const arrayMethods = Object.create(arrayProto);

// 改变数组自身内容的7个方法
const methodsToPatch = [
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'
];

methodsToPatch.forEach(function(method){
    const original = arrayProto[method]; // 缓存原生方法
    def(arrayMethods,method,function(...args){
        const result = original.apply(this, args);
        var ob = this.__ob__;
        var inserted;
        // push/unshift/splice会插入新的元素
        switch(method){
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice':
                inserted = args.slice(2);
                break;
        }
        // 将新插入的元素进行可观测化
        if(inserted) ob.observeArray(inserted);
        ob.dep.notify();
        return result;
    });
});